'\" t
.TH "SD_BUS_MESSAGE_NEW_METHOD_CALL" "3" "" "systemd 249" "sd_bus_message_new_method_call"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.\" http://bugs.debian.org/507673
.\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html
.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.ie \n(.g .ds Aq \(aq
.el       .ds Aq '
.\" -----------------------------------------------------------------
.\" * set default formatting
.\" -----------------------------------------------------------------
.\" disable hyphenation
.nh
.\" disable justification (adjust text to left margin only)
.ad l
.\" -----------------------------------------------------------------
.\" * MAIN CONTENT STARTS HERE *
.\" -----------------------------------------------------------------
.SH "NAME"
sd_bus_message_new_method_call, sd_bus_message_new_method_return \- Create a method call message
.SH "SYNOPSIS"
.sp
.ft B
.nf
#include <systemd/sd\-bus\&.h>
.fi
.ft
.HP \w'int\ sd_bus_message_new_method_call('u
.BI "int sd_bus_message_new_method_call(sd_bus\ *" "bus" ", sd_bus_message\ **" "m" ", const\ char\ *" "destination" ", const\ char\ *" "path" ", const\ char\ *" "interface" ", const\ char\ *" "member" ");"
.HP \w'int\ sd_bus_message_new_method_return('u
.BI "int sd_bus_message_new_method_return(sd_bus_message\ *" "call" ", sd_bus_message\ **" "m" ");"
.SH "DESCRIPTION"
.PP
The
\fBsd_bus_message_new_method_call()\fR
function creates a new bus message object that encapsulates a D\-Bus method call, and returns it in the
\fIm\fR
output parameter\&. The call will be made on the destination
\fIdestination\fR, path
\fIpath\fR, on the interface
\fIinterface\fR, member
\fImember\fR\&.
.PP
Briefly, the
\fIdestination\fR
is a dot\-separated name that identifies a service connected to the bus\&. The
\fIpath\fR
is a slash\-separated identifier of an object within the destination that resembles a file system path\&. The meaning of this path is defined by the destination\&. The
\fIinterface\fR
is a dot\-separated name that resembles a Java interface name that identifies a group of methods and signals supported by the object identified by path\&. Methods and signals are collectively called
\fImembers\fR
and are identified by a simple name composed of ASCII letters, numbers, and underscores\&. See the
\m[blue]\fBD\-Bus Tutorial\fR\m[]\&\s-2\u[1]\d\s+2
for an in\-depth explanation\&.
.PP
The
\fIdestination\fR
parameter may be
\fBNULL\fR\&. The
\fIinterface\fR
parameter may be
\fBNULL\fR, if the destination has only a single member with the given name and there is no ambiguity if the interface name is omitted\&.
.PP
Note that this is a low level interface\&. See
\fBsd_bus_call_method\fR(3)
for a more convenient way of calling D\-Bus methods\&.
.PP
The
\fBsd_bus_message_new_method_return()\fR
function creates a new bus message object that is a reply to the method call
\fIcall\fR
and returns it in the
\fIm\fR
output parameter\&. The
\fIcall\fR
parameter must be a method call message\&. The sender of
\fIcall\fR
is used as the destination\&.
.SH "RETURN VALUE"
.PP
On success, these functions return a non\-negative integer\&. On failure, they return a negative errno\-style error code\&.
.SS "Errors"
.PP
Returned errors may indicate the following problems:
.PP
\fB\-EINVAL\fR
.RS 4
The output parameter
\fIm\fR
is
\fBNULL\fR\&.
.sp
The
\fIdestination\fR
parameter is non\-null and is not a valid D\-Bus service name ("org\&.somewhere\&.Something"), the
\fIpath\fR
parameter is not a valid D\-Bus path ("/an/object/path"), the
\fIinterface\fR
parameter is non\-null and is not a valid D\-Bus interface name ("an\&.interface\&.name"), or the
\fImember\fR
parameter is not a valid D\-Bus member ("Name")\&.
.sp
The
\fIcall\fR
parameter is not a method call object\&.
.RE
.PP
\fB\-ENOTCONN\fR
.RS 4
The bus parameter
\fIbus\fR
is
\fBNULL\fR
or the bus is not connected\&.
.RE
.PP
\fB\-ENOMEM\fR
.RS 4
Memory allocation failed\&.
.RE
.PP
\fB\-EPERM\fR
.RS 4
The
\fIcall\fR
parameter is not sealed\&.
.RE
.PP
\fB\-EOPNOTSUPP\fR
.RS 4
The
\fIcall\fR
message does not have a cookie\&.
.RE
.SH "NOTES"
.PP
These APIs are implemented as a shared library, which can be compiled and linked to with the
\fBlibsystemd\fR\ \&\fBpkg-config\fR(1)
file\&.
.SH "EXAMPLES"
.PP
\fBExample\ \&1.\ \&Make a call to a D\-Bus method that takes a single parameter\fR
.sp
.if n \{\
.RS 4
.\}
.nf
#include <stdio\&.h>
#include <string\&.h>
#include <unistd\&.h>
#include <sys/types\&.h>

#include <systemd/sd\-bus\&.h>
#define _cleanup_(f) __attribute__((cleanup(f)))

/* This is equivalent to:
 * busctl call org\&.freedesktop\&.systemd1 /org/freedesktop/systemd1 \e
 *       org\&.freedesktop\&.systemd1\&.Manager GetUnitByPID $$
 *
 * Compile with \*(Aqcc \-lsystemd print\-unit\-path\&.c\*(Aq
 */

#define DESTINATION "org\&.freedesktop\&.systemd1"
#define PATH        "/org/freedesktop/systemd1"
#define INTERFACE   "org\&.freedesktop\&.systemd1\&.Manager"
#define MEMBER      "GetUnitByPID"

static int log_error(int error, const char *message) {
  fprintf(stderr, "%s: %s\en", message, strerror(\-error));
  return error;
}

static int print_unit_path(sd_bus *bus) {
  _cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
  _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
  _cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL;
  int r;

  r = sd_bus_message_new_method_call(bus, &m,
                                     DESTINATION, PATH, INTERFACE, MEMBER);
  if (r < 0)
    return log_error(r, "Failed to create bus message");

  r = sd_bus_message_append(m, "u", (unsigned) getpid());
  if (r < 0)
    return log_error(r, "Failed to append to bus message");

  r = sd_bus_call(bus, m, \-1, &error, &reply);
  if (r < 0)
    return log_error(r, "Call failed");

  const char *ans;
  r = sd_bus_message_read(reply, "o", &ans);
  if (r < 0)
    return log_error(r, "Failed to read reply");

  printf("Unit path is \e"%s\e"\&.\en", ans);

  return 0;
}

int main(int argc, char **argv) {
  _cleanup_(sd_bus_flush_close_unrefp) sd_bus *bus = NULL;
  int r;

  r = sd_bus_open_system(&bus);
  if (r < 0)
    return log_error(r, "Failed to acquire bus");

  print_unit_path(bus);
}
.fi
.if n \{\
.RE
.\}
.PP
This defines a minimally useful program that will open a connection to the bus, create a message object, send it, wait for the reply, and finally extract and print the answer\&. It does error handling and proper memory management\&.
.SH "SEE ALSO"
.PP
\fBsystemd\fR(1),
\fBsd-bus\fR(3),
\fBsd_bus_call\fR(3),
\fBsd_bus_call_method\fR(3),
\fBsd_bus_path_encode\fR(3)
.SH "NOTES"
.IP " 1." 4
D-Bus Tutorial
.RS 4
\%https://dbus.freedesktop.org/doc/dbus-tutorial.html#concepts
.RE
